﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.IO;

namespace Calcylator2
{
    class Program
    {
        public static bool ParseTheString(List<object> lis, Dictionary<string, double> dict, string s, string s3, string z, double x, int k, string[] str)
        {
            int n = 0;
            int l = 0;
            int c = 0;
            int p = 0;
            int o = 0;
            double value;
            for (int i = 0; i < s.Length; i++)
            {
                if (s.Length <= 2)
                {
                    break;
                }
                while ('0' <= s[i] && s[i] <= '9')
                {
                    z = s[i].ToString();
                    s3 += z;
                    i++;
                    p++;
                    if (i == s.Length)
                    {
                        break;
                    }
                   
                    if ('a' <= s[i] && s[i] <= 'z')
                    {
                        Console.WriteLine("Вы ввели выражение c с буквой");
                        return false;
                    }
                   
                }
                if (s3.Length != 0)
                {
                    if ('0' <= s3[0] && s3[0] <= '9')
                    {
                        x = Int32.Parse(s3);
                        lis.Add(x);
                        s3 = "";
                    }
                }
                if (i != s.Length)
                {

                    if (s[i] == '+')
                    {
                        lis.Add(s[i]);
                        p++;
                    }
                    if (s[i] == '-')
                    {
                        lis.Add(s[i]);
                        p++;
                    }
                    if (s[i] == '*')
                    {
                        lis.Add(s[i]);
                        p++;
                    }
                    if (s[i] == '/')
                    {
                        lis.Add(s[i]);
                        p++;
                    }
                    if (s[i] == '(')
                    {
                        lis.Add(s[i]);
                      
                        n++;
                        p++;
                    }
                    if (s[i] == ')')
                    {
                        lis.Add(s[i]);
                        p++;
                        l++;
                    }
                    if (s[i].ToString() == "@")
                    {
                        lis.Add(double.Parse(File.ReadAllText("Store.txt")));
                        p++;
                    }
                    if (i < lis.Count)
                    {
                        if (lis[i] is char)
                        {
                            c++;
                        }
                    }
                    if (dict.Count != 0)
                    {
                        string key = s[i].ToString();
                        if (dict.TryGetValue(key, out value))
                        {
                            lis.Add(value);
                            p++;
                        }
                    }
                }
            }
            if (str[0] != "store")
            {
                o=s.Length-p;
                if ( o!=0)
                {
                    Console.WriteLine( " Вы ввели не коректное выражение ");
                    return false;
                }
            }
            if (n != l)
            {
                Console.WriteLine("Ввыражении количество открывающих скобок = {0} не совпадает с закрывающимися = {1}", n, l);
                return false;
            }
            int m = 0;
            int v = 0;
            for (int j = 1; j < lis.Count; j++)
            {
                if (lis[v] is char && v == 0)
                {
                    v++;
                    if (lis[j - 1].ToString() != "(")
                    {
                        Console.WriteLine("Вы ввели первый символ - оператор");
                        return false;
                    }
                }
                if (lis[j - 1].ToString() == "+" && lis[j].ToString() == "+")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "+" && lis[j].ToString() == "-")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "+" && lis[j].ToString() == "*")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "+" && lis[j].ToString() == "/")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "-" && lis[j].ToString() == "-")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "-" && lis[j].ToString() == "+")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "-" && lis[j].ToString() == "*")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "-" && lis[j].ToString() == "/")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "*" && lis[j].ToString() == "*")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "*" && lis[j].ToString() == "+")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                } if (lis[j - 1].ToString() == "*" && lis[j].ToString() == "-")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                } if (lis[j - 1].ToString() == "*" && lis[j].ToString() == "/")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "/" && lis[j].ToString() == "/")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "/" && lis[j].ToString() == "+")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "/" && lis[j].ToString() == "-")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
                if (lis[j - 1].ToString() == "/" && lis[j].ToString() == "*")
                {
                    lis.RemoveAt(j - 1);
                    m++;
                    j--;
                }
            }
            if (m != 0)
            {
                Console.WriteLine("Вы ввели несколько символов подряд");
                return false;
            }
            return true;
        }
        static void Main(string[] args)
        {
            string s = null;
            int k = 0;
            Console.WriteLine("Для ввода значений введите ENTER ");
            Console.WriteLine("Для выхода введите exit ");
            Console.WriteLine("Введите выражение типа (operand1 operation operand2)");
            Dictionary<string, double> dict = new Dictionary<string, double>();
            List<object> lis = new List<object>();
            while (true)
            {
                bool result = false;
                double x = 0;
                string z = "";
                string s3 = "";
                s = Console.ReadLine();
                char[] c1 = s.ToCharArray();
                if (s == "exit")
                {
                    return;
                }
                string[] str = s.Split(' ');
                if (str[0] != "store")
                {
                    lis = new List<object>();

                    result = ParseTheString(lis, dict, s, s3, z, x, k, str);
                }
                if (result != false)
                {
                    Calcul.Counter(lis, 0);
                    if (lis.Count == 1)
                    {
                        Console.WriteLine(s + " = " + lis[0]);
                        File.WriteAllText("Store.txt", lis[0].ToString());
                    }
                }
                if (str.Length > 1)
                {
                    char[] ch = null;
                    ch = str[1].ToArray();
                    if (ch.Length != 1|| lis.Count!=1)
                    {
                        Console.WriteLine("Сохранение не произошло");
                    }

                    if (str[0] == "store" && ch.Length == 1&& lis.Count==1)
                    {
                        dict[str[1]] = Convert.ToDouble(lis[0]);
                        Console.WriteLine(s + " = " + lis[0]);
                    }
                }
            }
        }
    }
}